package core

import (
	"fmt"
	"reflect"

	"gitee.com/knowgo/ego/core/data"
)

type ServiceInstance struct {
	Service *data.ServiceRequest
	Error   string
	method  reflect.Method
	args    []reflect.Value
}

func (s *ServiceInstance) Execute() (interface{}, error) {
	res := s.method.Func.Call(s.args)
	if res == nil || len(res) != 2 {
		// 没有返回值，或这返回值的数量不是两个，基本上不可能出现这种情况
		return nil, fmt.Errorf("call <%s> error, need return values", s.Service.Service)
	}

	out := res[0].Interface()
	errOut := res[1].Interface()
	var err error = nil
	if errOut != nil {
		var ok bool
		if err, ok = errOut.(error); !ok {
			// 第二个参数返回的不是 error,基本上不能出现这种情况
			return nil, fmt.Errorf("resolver <%s> error, second return must be error", s.Service.Service)
		}
	}

	return out, err
}
